package cn.com.zzl.util;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

/**
 * Description：拼音工具类
 * Created by 朱正磊 on 2017-05-18 10:09.
 */
public class PinYinUtil {

	/**
	 * @Desc 将字符串中的中文转化为拼音，其他字符不变（字符串如果两端有空格会去掉）
	 * @param inputString 含有中文字符的字符串
	 * @return
	 */
	public static String getPinYin(String inputString){
		HanyuPinyinOutputFormat outputFormat = new HanyuPinyinOutputFormat();
		outputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);//小写字母
		outputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);//无声调
		outputFormat.setVCharType(HanyuPinyinVCharType.WITH_V);//不知道啥作用

		//inputString.trim()将字符串两端的空格去掉
		char[] input = inputString.trim().toCharArray();//字符串转字符数组
		String output = "";

		try {//如果try里面的某一行代码有异常，那么try里面的所有代码都不会被执行，进而执行catch里的代码
			for(int i = 0; i < input.length; i++){
				if(Character.toString(input[i]).matches("[\\u4E00-\\u9FA5]+")){//至少匹配一个汉字（其实可以去掉+，因为字符串只有一个字符）
					//汉字字符变拼音字符串数组（因为是单个汉字字符，所以拼音数组也只有一个元素）
					//汉字转拼音（最重要的一行代码）
					String[] temp = PinyinHelper.toHanyuPinyinStringArray(input[i],outputFormat);//其实temp字符串数组里只有一个元素
					output += temp[0];
				}else{
					output += Character.toString(input[i]);//如果不是汉字就不发生任何变化
				}
			}
		} catch (BadHanyuPinyinOutputFormatCombination e) {//catch里的代码执行完之后，如果下面还有代码会继续执行
			e.printStackTrace();
		}

		return output;
	}

	/**
	 * @Desc 将中文字符转换为拼音首字母小写，其他不变（字符串两端或者内部如果有空格会去掉）
	 * @param chinese 含有中文字符的字符串
	 * @return
	 */
	public static String getFirstSpell(String chinese){
		StringBuilder builder = new StringBuilder();//使用StringBuilder会比StringBuffer好一点（初始化为""）
		char[] charArray = chinese.toCharArray();//字符串转字符数组
		HanyuPinyinOutputFormat outputFormat = new HanyuPinyinOutputFormat();
		outputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);//小写字母
		outputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);//无声调
		for(int i = 0; i < charArray.length; i++){
			//A-Z的ASCII的值是065-090，a-z的ASCII的值是097-122，0-9的ASCII的值是048-057。
			if(charArray[i] > 128){//当字符的ASCII的值大于128的时候表示该字符是汉字
				try {
					//汉字字符变拼音字符串数组（因为是单个汉字字符，所以拼音数组也只有一个元素）
					//汉字转拼音（最重要的一行代码）
					String[] temp = PinyinHelper.toHanyuPinyinStringArray(charArray[i],outputFormat);//其实temp字符串数组里只有一个元素
					if(temp != null){
						builder.append(temp[0].charAt(0));//其中temp[0]表示拼音，charAt(0)表示拼音的首字母
					}
				} catch (BadHanyuPinyinOutputFormatCombination e) {
					e.printStackTrace();
				}
			}else{
				builder.append(charArray[i]);
			}
		}
		// \w 等价于 '[A-Za-z0-9_]'，而\W 等价于 '[^A-Za-z0-9_]'，\w 和 \W 恰恰相反
		// 如果不是字母或者数字或者下划线，那么用""来替换（比如空格、*、%、#、@、&等等）
		//return builder.toString().replaceAll("\\W","").trim();//trim()去掉字符串两端的空格

		return builder.toString().replaceAll("\\W","");//因为replaceAll("\\W","")已经包含trim()的作用，所以trim()多余

		/*String s1 = builder.toString();
		String s2 = s1.replaceAll("\\W","");
		String s3 = s2.trim();
		return s3;*/
	}

	/**
	 * @Desc 该方法貌似跟getPinYin方法实现的功能差不多，不过仅仅只是将中文转换为拼音不做其他任何操作
	 * @param chinese 含有中文字符的字符串
	 * @return
	 */
	public static String getFullSpell(String chinese){
		StringBuilder builder = new StringBuilder();//使用StringBuilder会比StringBuffer好一点（初始化为""）
		char[] charArray = chinese.toCharArray();//字符串转字符数组
		HanyuPinyinOutputFormat outputFormat = new HanyuPinyinOutputFormat();
		outputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);//小写字母
		outputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);//无声调
		for(int i = 0; i < charArray.length; i++){
			//A-Z的ASCII的值是065-090，a-z的ASCII的值是097-122，0-9的ASCII的值是048-057。
			if(charArray[i] > 128){//当字符的ASCII的值大于128的时候表示该字符是汉字
				try {
					builder.append(PinyinHelper.toHanyuPinyinStringArray(charArray[i],outputFormat)[0]);
				} catch (BadHanyuPinyinOutputFormatCombination e) {
					e.printStackTrace();
				}
			}else{
				builder.append(charArray[i]);
			}
		}
		return builder.toString();
	}

}
